package wenjun.du.androidart.activity

import android.content.res.Configuration
import android.os.Bundle
import android.util.Log
import androidx.appcompat.app.AppCompatActivity
import wenjun.du.androidart.R


/**
 * 关于activity的探索研究：
 *
 * 1* activity生命周期方法中的onResume和onPause方法和onStart和onStop方法的区别：
 * 这两对方法是从两个不同的角度来说的，前面两个是判断activity是否位于前台，后面两个方法是判断activity是否可见
 *
 * 2*当启动一个activity，前面一个activity(A)和后面一个activity(B)的生命周期事件如何：
 * onPause(A)-onCreate(B)-onStart(B)-onResume(B)-onStop(A)
 *
 * 3*Activity发生异常销毁时的生命周期函数调用情况：
 * activity状态保存流程：activity发生意外销毁，activity的onSaveInstanceState函数调用-通知window-window通知顶层ViewGroup(DecorView)-依次通知子控件去保存状态
 *
 * adb查看activity堆栈命令：adb shell dumpsys activity activities | grep "包名"
 * android:taskAffinity=""  设置堆栈的名称 不设置默认为包名
 * activity的启动模式：
 * standard:标准 谁启动activity 这个activity就进入谁的堆栈
 * singleTop: 栈顶复用模式 如果没有栈 则创建栈 再看该实例是否存在并且是否在栈顶
 * singleTask: 栈内复用模式
 * singleInstance ：程序内唯一实例 单独堆栈 单独实例
 *
 * activity中的显示和隐式启动
 *  显示：设定具体的待启动的类名
 *  隐私：通过action category和data匹配
 *  其中涉及到webView加载链接通过scheme中启动本地页面是通过协议启动的
 * */
class NormalActivity : AppCompatActivity() {

    companion object {
        private const val TAG = "NormalActivity======"
    }

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_normal)
    }


    override fun onConfigurationChanged(newConfig: Configuration) {
        super.onConfigurationChanged(newConfig)
        Log.d(TAG, "onConfigurationChanged: ${newConfig.orientation}")
    }

    /**
     * 异常情况下activity状态恢复函数的调用
     * 和onCreate方法中bundle参数的区别，一旦该方法调用了 参数必定不为空
     * 而onCreate方法中只有在真正发生数据保存的时候 该参数才不为空
     *
     * */
    override fun onRestoreInstanceState(savedInstanceState: Bundle) {
        super.onRestoreInstanceState(savedInstanceState)
        Log.d(TAG, "onRestoreInstanceState() called with: savedInstanceState = $savedInstanceState")
        val string = savedInstanceState.getString("activity_restore")
        Log.d(TAG, "onRestoreInstanceState: 测试保存的数据 $string")
    }


    /**
     * 异常情况下activity状态保存函数调用
     * 比如：系统资源发生变化(如果没有配置(configChanges)系统资源的config 横竖屏切换)导致activity重新创建
     *
     * */
    override fun onSaveInstanceState(outState: Bundle) {
        super.onSaveInstanceState(outState)
        outState.putString("activity_restore", "normaActivity")
        Log.d(TAG, "onSaveInstanceState() called with: outState = $outState")
    }
}